package cn.tedu._03vehicle.controller;

import cn.tedu._03vehicle.base.response.JsonResult;
import cn.tedu._03vehicle.base.response.StatusCode;
import cn.tedu._03vehicle.mapper.UserMapper;
import cn.tedu._03vehicle.pojo.dto.UserLoginParam;
import cn.tedu._03vehicle.pojo.dto.UserRegParam;
import cn.tedu._03vehicle.pojo.dto.UserVo;
import cn.tedu._03vehicle.pojo.entity.User;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpSession;
import java.util.Date;

@Api(tags = "01.用户管理模块")
@Slf4j
@RestController
@RequestMapping("/v1/user/")
public class UserController {

    @Autowired
    private UserMapper userMapper;


    @PostMapping("reg")
    @ApiOperation("注册功能")
    @ApiOperationSupport(order = 10)
    public JsonResult reg(@RequestBody UserRegParam userRegParam) {
        // 记录调试日志，输出接收到的用户注册参数
        log.debug("userRegParam " + userRegParam);
        // 从用户注册参数中获取用户名
        String username = userRegParam.getUsername();

        // 调用 userMapper 的 selectByUsername 方法，根据用户名查询数据库中是否存在该用户
        int i = userMapper.selectByUsername(username);
        // 如果查询结果大于 0，说明用户名已被占用
        if (i > 0) { //被占用
            // 返回一个表示用户名已存在的 JsonResult 对象
            return new JsonResult(StatusCode.USERNAME_EXISTS);
        }
        //若用户名未被占用
        User user = new User();
        // 使用 BeanUtils 工具类将 userRegParam 的属性复制到 user 对象中
        BeanUtils.copyProperties(userRegParam, user);
        // 设置用户的创建时间为当前时间
        user.setCreateTime(new Date());
        // 设置用户的更新时间为当前时间
        user.setUpdateTime(new Date());
        // 记录调试日志，输出即将插入数据库的用户信息
        log.debug("user " + user);
        // 调用 userMapper 的 insertUser 方法，将用户信息插入数据库
        userMapper.insertUser(user);
        // 返回一个表示操作成功的 JsonResult 对象
        return JsonResult.ok();

    }

    @PostMapping("login")
    @ApiOperation("登录功能")
    @ApiOperationSupport(order = 20)
    public JsonResult login(@RequestBody UserLoginParam userLoginParam, @ApiIgnore HttpSession session) {
        // 打印接收到的用户登录参数信息
        log.debug("userLoginParam " + userLoginParam);
        // 从用户登录参数中获取用户名
        String username = userLoginParam.getUsername();
        // 从用户登录参数中获取密码
        String password = userLoginParam.getPassword();
        // 调用 userMapper 的 loginUser 方法，根据用户名和密码查询用户信息
        UserVo userVo = userMapper.loginUser(username, password);
        // 判断是否查询到用户信息
        if (userVo != null) {
            // 打印查询到的用户信息
            log.debug("userVo " + userVo);
            session.setAttribute("user", userVo);
            // 如果查询到用户信息，返回成功响应，包含用户信息
            return JsonResult.ok(userVo);

        } else {

            // 如果未查询到用户信息，返回用户名或密码错误的响应
            return new JsonResult(StatusCode.USERNAME_PASSWORD_ERROR);
        }

    }
    @GetMapping("currentUser")
    @ApiOperation("获取当前用户功能")
    @ApiOperationSupport(order = 30)
    public JsonResult currentUser(@ApiIgnore HttpSession session) {

        // 从 HttpSession 中获取名为 "user" 的属性，并将其转换为 UserVo 类型
        UserVo userVo = (UserVo) session.getAttribute("user");

        // 使用 JsonResult.ok 方法返回包含用户信息的成功响应
      return JsonResult.ok(userVo);
    }

    @GetMapping("logout")
    @ApiOperation("退出登录功能")
    @ApiOperationSupport(order = 40)
    public void logout(@ApiIgnore HttpSession session){
        session.removeAttribute("user");

    }
}




